<?php
// *****************************************************************************
// $Id: init.php,v 0.1
// $Date: 2006/06/12
// Моудль: pictkey
// Префикс: pictkey_
// Описание: модуль генерации картинки с числовым кодом и шумом
// для ауентификации
// Автор: Алексей Горбылев, Алексей Дьяченко
/*
	Copyright 2006 Alex Djachenko http://www.my-site.ru
	Authors:  Aleksey Gorbilev, Alex Djachenko
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
// *****************************************************************************

$MT_mod_globals='';

// ************************************************
// Создаем масив настроек
$MT_mod_cfg = array();
// Подключаем файл с настройками
include mst_modpath('pictkey','cfg/config.php');
// ************************************************

// Инициализируем модуль шифрации Crypt из PEAR
mst_modload('pear','Crypt/Blowfish');

/**
 * @return Объект с картинкой формата PNG
 * @param ключ $key изображаемый на картинке
 * @desc Рисует картинку с изображением ключа и шумом
*/
function pictkey_genpict($key)
{
  $color_text = mst_getcfgmod('pictkey','color_text');
  $color_ground = mst_getcfgmod('pictkey','color_ground');
  $img = imagecreate(100,30);
  $blue = ImageColorAllocate($img, $color_text['r'], $color_text['g'],
			$color_text['b']);
  $white= ImageColorAllocate($img, $color_ground['r'], $color_ground['g'],
			$color_ground['b']);
  imagefilledrectangle($img,0,0,100,30,$white);
  for($i=0;$i<4;$i++)
  {
    $keych=substr($key,0+$i,1);
    $imgtemp = imagecreate(20,30);
    $bl = ImageColorAllocate($imgtemp,$color_text['r'], $color_text['g'],
			$color_text['b']);
    $wh = ImageColorAllocate($imgtemp,$color_ground['r'], $color_ground['g'],
			$color_ground['b']);
    imagefilledrectangle($imgtemp,0,0,20,30,$wh);
    $ang=12;
    for($j=0;$j<=$i;$j++)
    {
      $ang=$ang*(-1);
    }
    $font=mst_modpath("pictkey","/default.ttf");
    imagettftext($imgtemp,19,$ang,3,25,$blue,$font,$keych);
    if($i%2==0)
    {
      imagecopy($img,$imgtemp,4*($i)-2+20*$i,0,0,0,20,30);
    }
    else
    {
      imagecopy($img,$imgtemp,4*$i+20*$i,0,0,0,20,30);
    } 
  }  
  //--- dots
  $dotcount=rand(15,30);
  for($i=0;$i<$dotcount;$i++)
  {
  	imagesetpixel($img,rand(0,15),rand(0,30),$blue);
  }
  $dotcount=rand(70,100);
  for($i=0;$i<$dotcount;$i++)
  {
  	imagesetpixel($img,rand(15,85),rand(0,30),$blue);
  }
  $dotcount=rand(15,30);
  for($i=0;$i<$dotcount;$i++)
  {
  	imagesetpixel($img,rand(85,100),rand(0,30),$blue);
  }
  //-------
  ob_start();
  imagepng($img);
  $imgpng = ob_get_contents();
  ob_end_clean();
  return $imgpng;

}

/**
 * @return возвращает имя временного файла с картинкой
 * @param ключ $key передавемый функции рисования
 * @desc создает временный файл с картинкой
*/
function pictkey_genfile($key)
{
  $imgfilename = tempnam(mst_modpath('pictkey',"dat/"), "tpf_");
  file_put_contents($imgfilename, pictkey_genpict($key));
  return $imgfilename;
}

/**
 * @return изображение формата png в переменной
 * @param имя временного файла с картинкой $file
 * @desc открывает временный файл и считывает из него содержимое в переменную
*/
function pictkey_getfile($file)
{
$fsize=filesize($file);
$fp = fopen($file, "rb");
$image = fread($fp, $fsize);
fclose($fp);

echo $image; 
}

/**
 * @return массив с параметрами для генерации html кода - ссылка на картинку и md5 в скрытое поле для проверки
 * @param ключ $key, который будет изображен на картинке
 * @desc шифрует ключ, получает по нему ссылку на картинку, генерирует md5 для проверки введенного пользователем кллюча
*/
function pictkey_genvars($key)
{
	// получаем timestamp
	$timestamp=time();
	// добавляем timestamp к ключу до шифрации
	$kwt=$key.";".$timestamp;
	// шифруем ключик с датой
	$enckey = pictkey_encrypt($kwt);
	// генерируем md5 для передачи в форму
	$keycrypt=pictkey_genkeycrypt($key,$timestamp);
	
	$urladd=bin2hex($enckey);
	
	$src = mst_url('SHELL/switch/default/pictkey/pict/'.$urladd);
	$result=array("imgsrc" => $src, "keycrypt" => $keycrypt, "timestamp" => $timestamp);
	return $result;
}

/**
 * Генерирует ключ и возвращает массив со всеми переменными
 * @return array
 */
function pictkey_genvars_auto()
{
	//
	$key=(string)rand(1000,9999);
	return pictkey_genvars($key);
}
/**
 * @return md5 для проверки введенного ключа
 * @param ключ $key изображаемый на картинке
 * @desc генерирует md5 от $key, ip, пароля, даты и текущего часа
*/
function pictkey_genkeycrypt($key,$timestamp)
{
	$pass=mst_getcfgmod('pictkey','pass');
	$md5res=md5($pass.$key.$timestamp);
	return $md5res;
}

/**
 * @return правда/ложь
 * @param ключ $key введенный пользователем и $keycrypt(md5) из формы, который был сгенерирован ранее
 * @desc проверяет правильность введенного пользователем ключа
*/
function pictkey_check($key,$timestamp,$keycrypt)
{
	$time=time()-$timestamp;
	$result=true;
	if($time>3600)
	{
		$result=false;
	}
	$md5res=pictkey_genkeycrypt($key,$timestamp);
	if($md5res!=$keycrypt)
	{
		return false;
	}
	return $result;
}

/**
 * @return объект класса шифрации
 * @param -
 * @desc инициализирует шифрацию по ключу установленному в конфиге
*/
function pictkey_initcrypt()
{
  $bfkey=mst_getcfgmod('pictkey','bfkey');
  $bf=new Crypt_Blowfish($bfkey);
  return $bf;
}

/**
 * @return зашифрованная строка
 * @param строка $dcstr подлежащая шифрации
 * @desc шифрует строку
*/
function pictkey_encrypt($dcstr)
{
  $bf=pictkey_initcrypt();
  $enc = $bf->encrypt($dcstr);
  return $enc;
}

/**
 * @return расшифрованная строка
 * @param строка $ecstr подлежащая дешифрации
 * @desc расшифровывает исходную строку из зашифрованной
*/
function pictkey_decrypt($ecstr)
{
  $bf=pictkey_initcrypt();
  $dec = $bf->decrypt($ecstr);
  return $dec;
}
?>